package models;

import play.*;
import play.data.validation.MaxSize;
import play.data.validation.Required;
import play.db.jpa.*;
import play.data.binding.*;
import validation.Unique;

import javax.persistence.*;

import java.io.Serializable;
import java.util.*;
/**
 * 文章
 * @author yujie
 */
@Entity
public class WenZhang extends ShiTi implements Comparable<WenZhang>{
//	private class WenZhangComparator implements Comparator<WenZhang>{
//		@Override
//		public int compare(WenZhang o1, WenZhang o2) {
//			System.out.println("is compartor...");
//			return o2.xinZengShiJian.compareTo(o1.xinZengShiJian);
//		}
//	}

	/**
	 * 标题（非空，唯一）
	 */
	@Required
	@Unique(message = "WenZhang.biaoTi.Unique")
    public String biaoTi;
	
	/**
	 * 内容（非空，大容量，不超过一万字符）
	 */
	@Required
    @Lob
    @MaxSize(10000)
    public String neiRong;
	
	/**
	 * 主贴（本质上是文章对象）
	 * 双向映射关系：一个回帖（文章）对应一个主贴
	 */
	@ManyToOne
	public WenZhang zhuTie;
	
	/**
	 * 回帖（本质上也是文章对象）
	 * 双向映射关系：一个文章对应多个回帖
	 */
	@OneToMany(mappedBy="zhuTie", cascade=CascadeType.ALL)
	@OrderBy("xinZengShiJian DESC") 
    public List<WenZhang> huiTies;
	
    /**
     * 附件列表
     * 双向映射关系：一个文章对于多个附件
     */
	@OneToMany(mappedBy="wenZhang", cascade=CascadeType.ALL)
    public List<FuJian> fuJians;
	
	/**
	 * 所属版块
	 * 双向映射关系：多个文章对应一个版块
	 */
    @Required
	@ManyToOne
    public BanKuai banKuai;
    

	public WenZhang(YongHu xinZengYongHu, String biaoTi, String neiRong) {
		super();
		super.xinZengYongHu=xinZengYongHu;
		this.biaoTi = biaoTi;
		this.neiRong = neiRong;
	}
	/**
	 * 重新设定文章所属版块，并维护双向映射关系
	 * @param banKuai
	 */
	public void sheBanKuai(BanKuai banKuai){
		//如果本文章有所属版块，则将该文章从所属版块中的文章列表中删除
    	if(this.banKuai!=null){
    		this.banKuai.wenZhangs.remove(this);
    	}
    	//设定新的文章所属版块
    	this.banKuai=banKuai;
    	//如果新的所属版块的文章列表还没有包含当前文章，就把当前文章添加到版块的文章列表中
    	if(!banKuai.wenZhangs.contains(this)){
    		banKuai.wenZhangs.add(this);
    	}
    }
	
	/**
	 * 获得最后的回帖
	 * @return
	 */
    public WenZhang zuiHouHuiTie(){
    	WenZhang huiTie=WenZhang.find("wenZhang.zhuTie=? order by xinZengShiJian desc",this).first();
    	return huiTie;
    }
    
    /**
     * 获得所有回帖
     * @return
     */
    public List<WenZhang> suoYouHuiTie(){
    	List<WenZhang> huiTies=WenZhang.find("wenZhang.zhuTie=? order by xinZengShiJian desc",this).fetch();
    	return huiTies;
    }
    
	@Override
	public String toString() {
		return "标题："+(biaoTi.length() > 10 ? biaoTi.substring(0, 10) + "..." : biaoTi);
	}
	
	/**
	 * 新增回复内容和回复人
	 * @param huiFuYongHu
	 * @param biaoTi2
	 * @param neiRong2
	 */
	public void huiFu(YongHu huiFuYongHu, String neiRong) {
		WenZhang huiTie=new WenZhang(huiFuYongHu,"",neiRong);
		huiTie.zhuTie=this;
		huiTies.add(huiTie);
		save();
		this.refresh();
	}
	/* (non-Javadoc)
	 * @see java.lang.Comparable#compareTo(java.lang.Object)
	 */
	@Override
	public int compareTo(WenZhang arg0) {
		// TODO Auto-generated method stub
		return this.xinZengShiJian.compareTo(arg0.xinZengShiJian);
	}
	
}
